package reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //通过控制台读取一个类名
        Scanner scan = new Scanner(System.in);
        String className = scan.nextLine();
        System.out.println("className:"+className);
        //加载类
        Class clazz = Class.forName(className);
        //实例化
        Object obj = clazz.newInstance();
        /*获得该类的所有方法.
        * Method类封装了对应方法的所有信息,包含方法名,参数类型,返回类型,以及方法上的注解信息等等.*/
        Method[] methods = clazz.getDeclaredMethods();
        for (Method mh: methods) {
            /*
                调用目标对象的方法,所谓目标对象,指的是利用反射机制去调用的那个对象,目标方法指的是该对象的某个方法.
             */
            /*  obj就是目标对象,mh就是目标方法,rv就是目标方法的返回值.
             *  在调用目标方法之前,需要先获得目标方法的参数类型信息
             */
            Class[] types = mh.getParameterTypes();
            Object rv = null;
            if(mh.getName().contains("test")){
                if (types.length == 0) {
                    //目标方法不带参
                    rv = mh.invoke(obj);
                }else{
                    /*
                     * 目标方法带参数,依据参数类型进行相应的赋值.
                     * params用于存放实际参数值
                     * */
                    Object[] params = new Object[types.length];
                    for (int i = 0; i < params.length; i++) {
                        if(types[i] == String.class){
                            params[i] = "啦啦啦啦啦";
                        }
                        if(types[i] == int.class){
                            params[i] = 100;
                        }
                    }
                    //调用带参的方法
                    rv = mh.invoke(obj,params);
                }
                System.out.println("rv:"+rv);
            }
        }
    }
}
